package Abnormal;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class main {
    public static void main(String[] args) throws ParseException {
        /*
        异常：代表程序出现的问题
        ，是为了在程序出现异常后，该如何处理。异常的父类excepton分为编译时异常和运行时异常
         */
//        编译时异常
        String time="2030年1月1日";
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
        Date date=sdf.parse(time);
        System.out.println(date);
//         运行时异常,编译时不会异常，运行时出错


        /*
        try{
        可能出现的异常的代码
        }catch里传递出现的异常名
        catch(异常类名 变量名){
        异常的处理代码
        }            目的是为了当代码出现异常时，可以让程序继续向下执行

         */

/*        int[]arr1={1,2,3,4,5,6};
            try{
//                可能出现的异常的代码
                System.out.println(arr[10]);
            }catch (ArrayIndexOutOfBoundsException e){
//           出现了ArrayIndexOutOfBoundsException(查询的条件大于索引长度)该如何处理
//                可以以输出语句或者I/O的形式提示
                System.out.println("索引越界");
            }
        System.out.println("看看我执行了么？");*/
            /*
            自己处理异常的几个现象：
            1.如果try没有遇到异常怎么办
            答：会全部执行try里面的全部代码，不会执行catch里面的代码
            2.如果try遇到多个异常怎么办
            答：可以写一个try多个catch
            3.如果try遇到多个问题没有捕获怎么办
            答：try...catch中的代码白写了，最总会交给虚拟机处理
            4.如果try遇到问题，那么try下面的代码还会执行么
            答：如果try中第一行代码错误，那么try中的其它代码都不会执行，
               如果是其他行代码错误，那么该行以下的代码不会执行.
               即从异常的代码块开始，直接跳转到catch代码块
             */
            /*
            catch(变量 变量名){
            public String getMessage()          返回throwable的纤细消息字符串
            public String toString()            返回此可抛出的简短描述
            public void printStackTrace()       把异常的错误信息输出到控制台上

            }
             */
        int[]arr={1,2,3,4,5};
        try {
//            选中可能出现异常的类型，按快捷键ctrl+alt+t
            System.out.println(arr[10]);
        } catch (ArrayIndexOutOfBoundsException e) {
//            throw new RuntimeException(e);
            System.out.println(e.getMessage());//Index 10 out of bounds for length 5
            System.out.println(e.toString());
//            java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 5
            e.printStackTrace();//该行代码不会结束虚拟机，仅仅仅仅是进行一个打印的操作
            System.out.println("看看我执行了么");//执行了

        }
            /*
            throws:注意：写在方法定义处，表名声明一个异常
            告诉使用者，使用本方法可能会出现的异常
            public void 方法()throws  异常类名1，异常类名2....{}
           或者在方法中出现了多个异常，可以找到异常的共同父类，抛出异常的父类即可。
           对于throws抛出的异常处理  1.使用try-catch方法进行捕获异常，并进行异常处理
                                  2.可以再次使用throws进行异常抛出，让调用者处理


            throw：抛出单个异常，把这个异常交给方法的调用者
             */
        int[]arr2={1,2,3,4,5,6,7};
        getMax(arr2);
    }
    public static int getMax(int[]arr){
        if (arr==null){
//            手动创建一个异常对象，并把这个异常交给方法的调用者处理
//            此时方法会结束，下面代码就不会执行
            throw new NullPointerException();
        }
        System.out.println("看看执行了么");//执行了
        int max=arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (arr[i]>max){
                max=arr[i];
            }
        }
        return max;
    }
}
